Skip to content

ci(release): pre-publish backward-compat smoke against live hotcrm (#2035)#2093

Merged
xuyushun441-sys merged 1 commit into
mainfrom
spec/release-downstream-gate
Jun 21, 2026
Merged

ci(release): pre-publish backward-compat smoke against live hotcrm (#2035)#2093
xuyushun441-sys merged 1 commit into
mainfrom
spec/release-downstream-gate

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Follow-up to #2035 / #2088 / #2089 / #2092 — the final layer of the third-party validation strategy. You chose to run the live-hotcrm gate in the pre-publish / release workflow; this implements exactly that.

What

scripts/downstream-smoke.sh:

  1. clones objectstack-ai/hotcrm at a pinned tag (v1.2.0),
  2. installs it against the published @objectstack/* packages,
  3. overlays the freshly-built — i.e. unreleased@objectstack/spec dist,
  4. runs hotcrm's own typecheck + objectstack validate.

If the about-to-publish spec breaks a real, independently-authored consumer, the release is blocked.

Wired into release.yml between the build and the changesets publish step — so it runs only in the release pipeline, never on a feature PR. It mirrors the existing console-SPA step that already clones an external repo (objectui) at a pinned ref, so the pattern is established.

Where it sits

Layer Gate Runs PR
floor (deterministic) downstream-contract fixture every PR #2089
floor (deterministic) api-surface snapshot every PR #2092
ceiling (live) hotcrm smoke pre-publish only this

The fixture and snapshot are fast and run on every PR; this heavy, live check is the pre-publish backstop for anything they miss — at the cost of coupling to one external repo, which is why it's release-only and pinned to a tag (override via HOTCRM_REF).

Verified end-to-end (locally, real clone)

Ran the actual script: cloned hotcrm@v1.2.0pnpm install → overlaid the current spec build → typecheck (0 errors) + objectstack validate (✓ — 15 objects / 297 fields / 15 pages / 10 reports / 11 actions / 17 flows / 10 roles). Exit 0. (The only output warnings are hotcrm's own pre-existing dashboard-widget notices, unrelated to the spec.)

Notes

  • hotcrm is public, so no token needed; pnpm install falls back to --no-frozen-lockfile if hotcrm's lockfile drifts from current published versions.
  • CI/release-infra only — no consumer-facing change, no changeset.
  • Possible follow-up: retry-wrap the clone for transient network resilience.

🤖 Generated with Claude Code

…2035)

The last layer of the third-party validation strategy from #2035: a live ceiling
above the deterministic in-repo floor (@objectstack/downstream-contract, #2089).

`scripts/downstream-smoke.sh` clones objectstack-ai/hotcrm at a pinned tag
(v1.2.0), installs it against the PUBLISHED @objectstack/* packages, overlays the
freshly-built — unreleased — @objectstack/spec dist, and runs hotcrm's own
`typecheck` + `objectstack validate`. If the about-to-publish spec breaks a real,
independently-authored third-party consumer, the release is blocked.

Wired into release.yml between the build and the changesets publish step, so it
runs only in the release pipeline (never reddens a feature PR). Mirrors the
existing console-SPA step that already clones an external repo at a pinned ref.

Verified end-to-end locally: clone hotcrm@v1.2.0 → install → overlay current
spec → typecheck + validate both pass (15 objects / 15 pages / 10 reports / 11
actions / 17 flows). Override the pinned ref with HOTCRM_REF.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 21, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 21, 2026 6:25am

Request Review

@xuyushun441-sys
xuyushun441-sys merged commit 383c247 into main Jun 21, 2026
15 checks passed
@xuyushun441-sys
xuyushun441-sys deleted the spec/release-downstream-gate branch June 21, 2026 06:28
xuyushun441-sys added a commit that referenced this pull request Jun 21, 2026
…ates (#2035) (#2098)

Documents the layered strategy built across #2088/#2089/#2092/#2093/#2095/#2097
in one authoritative place: why in-repo consumers can't witness backward compat
(they co-evolve with the spec), the six gates and each one's job, and — crucially
— the FREEZE CONTRACT: a change that requires editing the fixtures or removing a
snapshot entry is by definition breaking (bump major), never a mechanical
test-update. Also formalizes `objectstack validate` as the third party's
authoritative self-gate.

Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants